/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo.DAL;

import Modelo.ObjetoPerdido;
import Modulo4.modificarObjetoPerdidoForm;
import java.sql.Date;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONObject;

/**
 *
 * @author dayana
 */
public class ObjetoPerdido_DAO {

    //Variable global que guarda los indices que se liberan al eliminar un objeto perdido
    private static List<Long> indices = new ArrayList<Long>();

    public static boolean llenarModForm(String id, modificarObjetoPerdidoForm formBean) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        boolean aux = true;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error en llenarModForm!");
            return true;
        }

        String query = "SELECT fecha_ingreso, status, id_tipo_objeto, descripcion FROM objeto_perdido WHERE"
                + " id_objeto = '" + id + "';";

        System.out.println(query);

        formBean.setFechaIngreso("");
        formBean.setNew_status("");
        formBean.setNew_descrip("");
        formBean.setTipoObj("");

        try {
            rs = s.executeQuery(query);
            int i = 0;
            while (rs.next()) {
                String Fecha = rs.getString(1);
                Fecha = Fecha.substring(8, 10) + "/"
                            + Fecha.substring(5, 7) + "/"
                            + Fecha.substring(0, 4);
                formBean.setFechaIngreso(Fecha);
                formBean.setNew_status(rs.getString(2));
                formBean.setNew_descrip(rs.getString(4));
                formBean.setTipoObj(rs.getString(3));
                aux = false;
            }

        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error en llenarModForm2");
            return true;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }

        return aux;
    }

    public boolean insertarObjetoPerdido(ObjetoPerdido objper) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        long aux = objper.getIdObjeto();

        if (!indices.isEmpty()) {
            aux = indices.get(0);
            indices.remove(0);
        }

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Insertando Objeto Perdido1! " + se.getMessage());
            return false;
        }
        String query = "INSERT INTO objeto_perdido(id_objeto,id_tipo_objeto, status, fecha_ingreso, descripcion)"
                + "VALUES ('" + aux + "','" + objper.getIdTipoObjeto() + "','" + objper.getStatus() + "','" + objper.getFechaIngreso() + "','" + (objper.getDescripcion()).replace("\\", "\\\\").replace("'", "\\'") + "')";
        System.out.println(query);
        try {
            s.executeUpdate(query);
            return true;
        } catch (SQLException se) {
            System.out.println("Error Insertando Objeto Perdido2! " + se.getMessage());
            return false;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static List<ObjetoPerdido> consultarObjetoPerdido(String tipo) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;

        String query = "SELECT id_objeto, id_tipo_objeto, status, fecha_ingreso, descripcion FROM objeto_perdido WHERE id_tipo_objeto='" + tipo + "';";

        System.out.println(query);

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Consultando Objeto Perdido! " + se.getMessage());
            return null;
        }

        try {
            rs = s.executeQuery(query);

            List<ObjetoPerdido> objetos = new ArrayList();
            try {
                int i = 0;
                while (rs.next()) {
                    ObjetoPerdido obj = new ObjetoPerdido(Long.parseLong(rs.getString(1)), rs.getString(2), rs.getString(3), Date.valueOf(rs.getString(4)), rs.getString(5));
                    objetos.add(obj);

                }
            } catch (Exception e) {
            }
            return objetos;
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error Consultando Objeto Perdido " + se.getMessage());
            return null;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static JSONObject listarAll(String where) {
        ConexionBD conex = new ConexionBD();
        JSONObject objetos = new JSONObject();

        try {
            Statement st = (Statement) conex.session.createStatement();
            String query = "SELECT id_objeto, id_tipo_objeto, status, fecha_ingreso, descripcion, "
                    + "(SELECT count (*) FROM objeto_perdido) FROM objeto_perdido WHERE status != 'Entregado' "
                    + where + ";";

            System.out.println(query);
            ResultSet rs = st.executeQuery(query);

            int i = 0;
            while (rs.next()) {
                JSONObject objeto = new JSONObject();
                objeto.put("id", rs.getString(1));
                objeto.put("tipo", rs.getString(2));
                objeto.put("status", rs.getString(3));
                String Fecha = rs.getString(4);
                objeto.put("fecha", Fecha.substring(8, 10) + "/"
                        + Fecha.substring(5, 7) + "/"
                        + Fecha.substring(0, 4));
                objeto.put("descripcion", rs.getString(5));
                // ojo con lo de abajo
                objeto.put("tam", rs.getString(6));
                objetos.put("" + i++, objeto);
            }
        } catch (Exception e) {
            System.out.println("Excepcion: " + e);
        }
        return objetos;
    }

    public static JSONObject listarAllPorTipo(String tipo, String where) {
        ConexionBD conex = new ConexionBD();
        JSONObject objetos = new JSONObject();

        try {
            Statement st = (Statement) conex.session.createStatement();
            String query = "SELECT id_objeto, id_tipo_objeto, status, fecha_ingreso, descripcion, "
                    + "(SELECT count (*) FROM objeto_perdido) FROM objeto_perdido "
                    + "WHERE id_tipo_objeto='" + tipo + "' AND status != 'Entregado' "
                    + where + ";";

            System.out.println(query);
            ResultSet rs = st.executeQuery(query);

            int i = 0;
            while (rs.next()) {
                JSONObject objeto = new JSONObject();
                objeto.put("id", rs.getString(1));
                objeto.put("tipo", rs.getString(2));
                objeto.put("status", rs.getString(3));
                String Fecha = rs.getString(4);
                objeto.put("fecha", Fecha.substring(8, 10) + "/"
                        + Fecha.substring(5, 7) + "/"
                        + Fecha.substring(0, 4));
                objeto.put("descripcion", rs.getString(5));
                // ojo con lo de abajo
                objeto.put("tam", rs.getString(6));
                objetos.put("" + i++, objeto);
            }
        } catch (Exception e) {
            System.out.println("Excepcion: " + e);
        }
        return objetos;
    }

    public static List<ObjetoPerdido> consultarTodosObjetosPerdidos() {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;

        String query = "SELECT id_objeto, id_tipo_objeto, status, fecha_ingreso, descripcion FROM objeto_perdido;";

        System.out.println(query);

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Consultando Todos Objetos Perdidos! " + se.getMessage());
            return null;
        }

        try {
            rs = s.executeQuery(query);

            List<ObjetoPerdido> objetos = new ArrayList();
            try {
                int i = 0;
                while (rs.next()) {
                    ObjetoPerdido obj = new ObjetoPerdido(Long.parseLong(rs.getString(1)), rs.getString(2), rs.getString(3), Date.valueOf(rs.getString(4)), rs.getString(5));
                    objetos.add(obj);

                }
            } catch (Exception e) {
            }
            return objetos;
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error Consultando Todos Objetos Perdidos " + se.getMessage());
            return null;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static ObjetoPerdido consultaInfoObjeto(long id) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        ObjetoPerdido obj = null;
        String query = "SELECT * FROM objeto_perdido WHERE id_objeto='" + id + "';";

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Consultando Info Objeto Perdido! " + se.getMessage());
            return null;
        }

        try {
            rs = s.executeQuery(query);

            try {
                int i = 0;
                while (rs.next()) {
                    obj = new ObjetoPerdido(Long.parseLong(rs.getString(1)), rs.getString(2), rs.getString(3), Date.valueOf(rs.getString(4)), rs.getString(5));
                }
            } catch (Exception e) {
            }
            return obj;
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error Consultando Info Objeto Perdido " + se.getMessage());
            return null;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static boolean modificarObjetoPerdido(long id, String status, String descripcion) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;


        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Modificando Objeto Perdido1! " + se.getMessage());
            return false;
        }
        String query = "UPDATE objeto_perdido SET status = '" + status + "' , descripcion = '" + descripcion.replace("\\", "\\\\").replace("'", "\\'") + "' WHERE id_objeto = " + id + ";";

        System.out.println(query);
        try {
            s.executeUpdate(query);
            return true;
        } catch (SQLException se) {
            System.out.println("Error modificando Objeto Perdido2! " + se.getMessage());
            return false;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

    public static boolean eliminarObjetoPerdido(long idObj) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        String query2 = null;
        ResultSet rs = null;
        int aux = 0;
        String tipo = null;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Eliminando Objeto Perdido1! " + se.getMessage());
            return false;
        }
        String query = "DELETE FROM objeto_perdido WHERE id_objeto=" + idObj + ";";
        System.out.println(query);

        //Obtenemos el tipo de objeto y la cantidad de tipo de objeto que hay para
        //que al no haber mas objetos de un tipo, este tipo se elimine.
        query2 = "SELECT id_tipo_objeto, (SELECT count(*) FROM objeto_perdido WHERE id_objeto='" + idObj + "') "
                + "FROM objeto_perdido WHERE id_objeto='" + idObj + "';";
        System.out.println(query2);

        try {

            indices.add(idObj);

            rs = s.executeQuery(query2);

            while (rs.next()) {
                tipo = rs.getString(1);
                aux = rs.getInt(2);
            }
            System.out.println(" tipo: " + tipo + " cat: " + aux);

            s.executeUpdate(query);

            if (aux == 1) {
                query = "DELETE FROM tipo_objeto WHERE id_tipo_objeto='" + tipo + "';";
                System.out.println(query);

                try {
                    s.executeUpdate(query);
                } catch (SQLException se) {
                    System.out.println("Error Eliminando Tipo objeto! " + se.getMessage());

                }
            }



            return true;
        } catch (SQLException se) {
            System.out.println("Error Eliminando Objeto Perdido2! " + se.getMessage());
            return false;
        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();
            }
        }
    }

//Esta funcion devuelve la cantidad de entradas que tiene la tabla objeto_perdido
    public String obtenerUltimoIndice() {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;



        try {
            s = conexion.session.createStatement();


        } catch (SQLException se) {
            System.out.println("Error Obteniendo Ultimo Indice! " + se.getMessage());


            return null;


        }
        String query = "SELECT count(*) FROM objeto_perdido;";

        System.out.println(query);


        try {
            rs = s.executeQuery(query);

            rs.next();



            return rs.getString(1);



        } catch (SQLException se) {
            System.out.println("Error Obteniendo Ultimo Indice! " + se.getMessage());


            return null;


        } finally {
            if (conexion != null) {
                conexion.cerrarConexion();

            }
        }
    }
}
